
package practica1compi1;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Mario
 */
public class Arbol {
    
    List<clsToken> _Listado = new ArrayList<clsToken>();
    String matrizArbol[][];
    List<clsToken> Listado;
    
    int UltimoEstado=0;
    int contHojas = 0;
    
    
    
    public void Analizar( List<clsToken> pListado){
        Listado=pListado;
        matrizArbol  = new String[20][20];
        
        clsToken t4 = new clsToken();
        clsToken t3 = new clsToken();
        
        t4._value=".";
        t4._Tipo= clsToken.TipoToken.SYMBOL_DOT;
        Listado.add(0, t4);
        
        t3._value="#";
        t3._Tipo= clsToken.TipoToken.SYMBOL_NUM;
        Listado.add(Listado.size(), t3);
        
        for (int i = 0; i < Listado.size(); i++) {
            String s = Listado.get(i)._value;
            System.out.println(s);
        }
        
        calcular(Listado.get(0),0,pListado);
    }
    

private int calcular (clsToken TokenActual,int posicionActual,List<clsToken> pListado)    {
 
        //posicionActual=calcular(pListado.get(posicionActual),posicionActual,pListado);
        //posicionActual++;
    
       
         
        switch(TokenActual._Tipo){
            
            case 8:  // '|'
                matrizArbol[posicionActual][0]=pListado.get(posicionActual)._value;
                int posicionTemp1=posicionActual;
                 
                 posicionActual++;
                 posicionActual=calcular(pListado.get(posicionActual),posicionActual,pListado);
                 posicionActual++;
                 posicionActual=calcular(pListado.get(posicionActual),posicionActual,pListado);
                 
                 //Anulable
                 if((matrizArbol[posicionActual][1]=="T") || (matrizArbol[posicionActual-1][1]=="T")) {
                    matrizArbol[posicionTemp1][1]="T";
                 }
                 else{
                     matrizArbol[posicionTemp1][1]="F";
                 }
                 
                 //Primeros
                    matrizArbol[posicionTemp1][2]=matrizArbol[posicionActual-1][2]+matrizArbol[posicionActual][2];
                 
                 //Ultimos
                    matrizArbol[posicionTemp1][3]=matrizArbol[posicionActual-1][3]+matrizArbol[posicionActual][3];
                 
                break;
            case 6:  // '.'
                //posicionActual=calcular(pListado.get(posicionActual),posicionActual,pListado);
                 //Asignando Valor
                 matrizArbol[posicionActual][0]=pListado.get(posicionActual)._value;
                 int posicionTemp2=posicionActual;
                 
                 posicionActual++;
                 posicionActual=calcular(pListado.get(posicionActual),posicionActual,pListado);
                 posicionActual++;
                 posicionActual=calcular(pListado.get(posicionActual),posicionActual,pListado);
                 
                 //Anulable
                 if((matrizArbol[posicionActual][1]=="T") &&(matrizArbol[posicionActual-1][1]=="T")) {
                    matrizArbol[posicionTemp2][1]="T";
                 }
                 else{
                     matrizArbol[posicionTemp2][1]="F";
                 }
                 
                 //Primeros
                 if (matrizArbol[posicionActual-1][1]=="T"){
                    matrizArbol[posicionTemp2][2]=matrizArbol[posicionActual-1][2]+matrizArbol[posicionActual][2];
                 }
                 else{
                    matrizArbol[posicionTemp2][2]=matrizArbol[posicionActual-1][2];
                 }
                 
                 //Ultimos
                 if (matrizArbol[posicionActual][1]=="T"){
                    matrizArbol[posicionTemp2][3]=matrizArbol[posicionActual-1][3]+matrizArbol[posicionActual][3];
                 }
                 else{
                    matrizArbol[posicionTemp2][3]=matrizArbol[posicionActual][3];
                 }
                 
                break;
            case  5: // '*'  
                 matrizArbol[posicionActual][0]=pListado.get(posicionActual)._value;
                 matrizArbol[posicionActual][1]="T";
                 matrizArbol[posicionActual][2]=matrizArbol[posicionActual-1][2];
                 matrizArbol[posicionActual][3]=matrizArbol[posicionActual-1][3];
                 posicionActual++;
                 
                break;
            case 7:  // '?'
                 matrizArbol[posicionActual][0]=pListado.get(posicionActual)._value;
                 matrizArbol[posicionActual][1]="T";
                 matrizArbol[posicionActual][2]=matrizArbol[posicionActual-1][2];
                 matrizArbol[posicionActual][3]=matrizArbol[posicionActual-1][3];
                 posicionActual++;
                
                
                break;
            
            case  9:  // '+'
                 matrizArbol[posicionActual][0]=pListado.get(posicionActual)._value;
                 matrizArbol[posicionActual][1]=matrizArbol[posicionActual-1][1];
                 matrizArbol[posicionActual][2]=matrizArbol[posicionActual-1][2];
                 matrizArbol[posicionActual][3]=matrizArbol[posicionActual-1][3];
                 posicionActual++;
                 
                break;
            case 10:  // ID
                contHojas++;
                 matrizArbol[posicionActual][0]=pListado.get(posicionActual)._value;
                 matrizArbol[posicionActual][1]="F";
                 matrizArbol[posicionActual][2]=""+contHojas;
                 matrizArbol[posicionActual][3]=""+contHojas;
                 //posicionActual++;
                 break;
            case  11:  // '#'
                 contHojas++;
                 matrizArbol[posicionActual][0]=pListado.get(posicionActual)._value;
                 matrizArbol[posicionActual][1]="F";
                 matrizArbol[posicionActual][2]=""+contHojas;
                 matrizArbol[posicionActual][3]=""+contHojas;
                
                //posicionActual++;
                 
                break;
        } 
        UltimoEstado=posicionActual;
        return posicionActual;
    }

public void DibujarMatriz() {
    
         for (int i=0;i<=UltimoEstado;i++)        {
             String strLinea = "";
             for (int j=0;j<=3;j++){
                 strLinea= strLinea+matrizArbol[i][j]+"\t";
             }
             System.out.println(strLinea);
        }
    }


}
